package org.web.clientlistmanager.sdk.dto;

import javax.validation.constraints.*;

import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.List;

/**
 * 用以包装基客户端基本信息，包括微服务名称、运行实例IP、启动时间戳、唯一标识、扩展值等。
 * 该信息用于注册使用。
 */

@Setter
@Getter
@Configuration("localClientProcessDTO")
public class LocalClientProcessDTO {

    /**
     * 客户端SDK版本号，当前版本为1.0.0，后续版本迭代时，版本号会进行更新, 用于兼容性处理
     * */
    private String version ="1.0.0";

    /**
     * 客户端微服务名称，嵌入的微服务名称，即传统意义上的微服务名称。也是许可定义的微服务名称。来源于客户端配置参数，由客户端注册时提供。
     */
    @NotBlank(message = "clientServiceName can't be blank. ")
    @Size(max = 200)
    @Value("${org.web.clientlistmanager.client.clientServiceName}")
    private String clientServiceName;

    /**
     * 运行实例IP，微服务运行的服务IP, 客户端可被对外访问的IP地址。
     * 需要考虑对IPV6的支持，以及未来容器场景下的IP影响。
     * 优先来源于客户端配置参数，如果没有配置，则基于JDK默认获取IP处理，由客户端注册时提供, 参见  {@link #initClientAddress()}  方法。
     */
    @Size(max = 255)
    @Value("${org.web.clientlistmanager.client.clientAddress:}")
    private String clientAddress;

    /**
     * 客户端启动时间戳，格式【yyyy-MM-dd HH:mm:ss】，来源于客户端SDK，客户端启动时创建，且不允许修改，由客户端注册时提供。
     */
    private String processStartTime = null;

    /**
     * 进程号，微服务运行的服务号，即linux进程号，不需要客户端配置，客户端启动时自动获取，且不允许修改，由客户端注册时提供。
     */
    private String processNum;

    /**
     * 客户端产生的UUID，客户端启动时创建，且不允许修改，由客户端注册时提供。客户端与服务端的心跳交互，也是通过UUID进行交互。
     * 初始化，参见 {@link  org.web.clientlistmanager.client.config.ClmClientConfig#initLocalClientProcessDO(LocalClientProcessDTO)}
     */
    private String processUuid;

    /**
     * 唯一标识，同一个服务在一个IP下是否唯一。enum={Y:表示唯一;N:表示不唯一。}，默认值为[Y]。
     */
    @Pattern(regexp = "^([YN])$", message = "Y:表示唯一;N:表示不唯一。")
    @Value("${org.web.clientlistmanager.client.isUniquePerIp:Y}")
    private String isUniquePerIp = "Y";

    /**
     * 扩展值，业务方的扩展值，允许变更，但不推荐。由客户端注册时提供。
     */
    @Size(max = 1000, message = "clientExtendedValue 长度不要超过1000个字符。")
    @Value("${org.web.clientlistmanager.client.clientExtendedValue:}")
    private String clientExtendedValue;

    public void initClientAddress() throws UnknownHostException {
        if (StringUtils.isBlank(clientAddress)) {
            // TODO 默认规则的IP地址不一定正确，主要是多网卡场景下，获得的IP,不一定符合预期。
            InetAddress localhost = InetAddress.getLocalHost();
            setClientAddress(localhost.getHostAddress());
        }
    }

    /**
     * 客户端详情信息列表，客户端启动注册时提供。
     * */
    private List<LocalClientTypeListDTO> localClientTypeDetailDTOList;
}
